home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / sun4.md / Sync_GetLock.s < prev    next >
Text File  |  1989-07-31  |  3KB  |  83 lines

  1. /*
  2.  * syncAsm.s --
  3.  *
  4.  *    Source code for the Sync_GetLock library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16.     .seg    "data"
  17.     .asciz "$Header: /sprite/src/lib/c/sync/sun4.md/RCS/Sync_GetLock.s,v 1.2 89/07/31 17:48:11 mgbaker Exp $ SPRITE (Berkeley)"
  18.     .align    8
  19.     .seg    "text"
  20.  
  21. /*
  22.  * ----------------------------------------------------------------------------
  23.  *
  24.  * Sync_GetLock --
  25.  *
  26.  *    Acquire a lock.  Other processes trying to acquire the lock
  27.  *    will block until this lock is released.
  28.  *
  29.  *      A critical section of code is protected by a lock.  To safely
  30.  *      execute the code, the caller must first call Sync_GetLock to
  31.  *      acquire the lock on the critical section.  At the end of the
  32.  *      critical section the caller has to call Sync_Unlock to release
  33.  *      the lock and allow other processes to execute in the critical
  34.  *      section.
  35.  *
  36.  * Results:
  37.  *    None.
  38.  *
  39.  * Side effects:
  40.  *      The lock is set.  Other processes will be blocked if they try
  41.  *      to lock the same lock.  A blocked process will try to get the
  42.  *      lock after this process unlocks the lock with Sync_Unlock.
  43.  *
  44.  * C equivalent:
  45.  *
  46.  *    void
  47.  *    Sync_GetLock(lockPtr)
  48.  *       Sync_Lock *lockPtr;
  49.  *    {
  50.  *        if (Sun_TestAndSet(&(lockPtr->inUse)) != 0) {
  51.  *        Sync_SlowLock(lockPtr); 
  52.  *        }
  53.  *    }
  54.  *
  55.  *----------------------------------------------------------------------
  56.  */
  57.  
  58. .seg    "text"
  59. .globl _Sync_GetLock
  60. _Sync_GetLock:
  61.  
  62.     /*
  63.      * This TestAndSet races with the assignment statement in Sync_Unlock
  64.      * that clears the inUse bit.  The worst case is that we incorrectly
  65.      * assume the lock is taken just as someone clears this bit.  This is
  66.      * ok because we'll call Sync_SlowLock which does the check again
  67.      * inside a protected critical section.
  68.      */
  69.     /* prologue */
  70.     set        (-104), %g1
  71.     save    %sp, %g1, %sp
  72.     /* end prologue */
  73.     mov        %i0, %o0        /* put ptr in arg for next call */
  74.     ldstub    [%i0], %i0        /* Atomically get value and set it. */
  75.     tst        %i0            /* Test it. */
  76.     be,a    ReturnHappy        /* If not set, just return. */
  77.     nop
  78.     call    _Sync_SlowLock,1
  79.     nop
  80. ReturnHappy:
  81.     ret
  82.     restore
  83.